
import Cookies from 'js-cookie'

export default {
  /**
   * 获取uuid
   * @returns {string}
   */
  uuid () {
    function S4 () {
      return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
    }
    return (S4() + S4() + S4())
    // uuid=69dd9d51-9ab5-cd1f-1fd1-088d3e9825e2
    // return (S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4())
  },
  /**
   * 对象转url str
   * 只支持一级obj
   */
  obj2Str (obj) {
    // debugger
    if (this.isNull(obj)) {
      return ''
    }
    let str = ''
    const unique = {}
    for (const key in obj) {
      // debugger
      if (!unique[key]) {
        unique[key] = true
        let val = obj[key]
        // if (this.checkChinese(val)) {
        val = encodeURIComponent(val)
        // }
        str += '&' + key + '=' + val
      }
    }
    str = '?' + str.substr(1)
    return str
  },
  // 设置连接参数
  setHrefParams (q) {
    // const query = this.queryParams
    var queryParams = this.getCurPathParam()
    // debugger
    // const obj = Object.assign({}, query, q)
    const obj = { ...queryParams, ...q }
    this.onlyModifyParamsOnUrl(obj, { isReplace: true }) // TODO1:1关于该方法修改了query参数，是否需要及时更新queryParams
    return obj
  },
  /**
   * 在不刷新页面的情况下，修改url参数
   * @param {Object} data
   *  主要方法h5的 pushState(replaceState 和 pushState 唯一的区别：replaceState不会新增历史，pushState会新增历史)
   *  stateObject:JavaScript对象，通过pushState方法可以将stateObject内容传递到新页面中;
   *  title: 几乎没有浏览器支持该参数，但是传一个空字符串会比较安全。
   *  url: 新的历史记录条目的地址（可选，不指定的话则为文档当前URL）；浏览器在调用pushState()方法后不会加载该地址；传入的URL与当前URL应该是同源的，否则，pushState()会抛出异常。
   * @param {Object} config
   */
  onlyModifyParamsOnUrl (data, config) {
    config = config || {}
    // const tt = window.location
    let url = ''
    let len = ''
    url = location.hash
    len = url.indexOf('?')

    if (len !== -1) {
      url = url.substring(0, len)
    }

    const str = this.obj2Str(data)
    url += str
    // debugger
    if (config.isReplace) {
      history.replaceState({}, '', url)
      // debugger
      // merge(router.query, data)
      // router.replace({ query: data })
    } else {
      history.pushState({}, '', url)
    }
  },
  // 获取链接末尾参数
  getCurPathParam () {
    let url = ''
    url = location.hash // 获取链接 #/...? 后的字符串，并组合成 json 格式
    const newObj = this.getUrlQuery2Params(url)
    // debugger
    return newObj
  },
  // 获取字符链接的参数，并转为json对象
  getUrlQuery2Params (url) {
    const newObj = {}
    // debugger
    const qStr = url.split('?')
    if (qStr.length > 1) {
      const str1 = this.recursionDecode(qStr[1])
      const sArr = str1.split('&')
      // debugger
      for (let i = 0; i < sArr.length; i++) {
        const item = sArr[i]
        const arr = item.split('=')
        // 使用正则表达式匹配 'redirect=' 和随后的URL参数
        // http://127.0.0.1:8080/#/?title=%E5%AE%9E%E6%96%BD%E4%BA%BA%E5%91%982%E7%9A%84%E5%B2%97%E4%BD%8D%E7%BC%96%E5%88%B6%E8%B0%83%E6%95%B4%E5%AE%A1%E6%89%B9%E6%B5%81%E7%A8%8B%EF%BC%88%E6%B5%8B%E8%AF%95%EF%BC%89&redirect=base-manage%2fhr-manage%2fuser-process-form%3fWfDetailKeyId%3dE7BA21426B4981B4BFA7AE262974B61763CF0CAEA430E5F185BF53F33447E693A25B3A74E41DBE9EEEF58868C16633A6C50D4322B709838FAE65A9FB188B37CC%26isOnlyShowContent%3d1%26name%3dUserProcessForm&sid=3&&kid=001&loginid=50100391&timestamp=1717640215107&token=001eb09e43ee11cf1439856fbf1a5fa200ddbd82（泛微推送--这是一开始的版本）
        // http://127.0.0.1:8080/#/base-manage/hr-manage/user-process-form?WfDetailKeyId=A54B8085C566D7FED931D26E173CA222AAADD824886571CD3651A5322173E06013BCBAA076A4742F0145B0768E002320EF6D2CC1E7C03842B6EF1EB0D1D6889A&isOnlyShowContent=1&sid=3&kid=001&loginid=50100391&timestamp=1717545136018&token=d3f5e6429cdfb77a9dacae12c4cf5ee1f06da640&title=刘毓煊的员工证明申请流程_20240604（泛微推送--后面版本）
        const regex = /^(redirect=)([^?]*)(\?.*)$/ // 高级表单推送信息的地址
        const match = item.match(regex)
        // const match = regex.test(item)
        if (match) {
          const part2 = match[2] + match[3]
          newObj[arr[0]] = part2
        } else {
          newObj[arr[0]] = arr[1]
        }
      }
      // debugger
    }
    return newObj
  },
  // 判断一个字符是否经过URL编码， 是则返回true
  isURLEncoded (character) {
    const reg = new RegExp('%[0-9A-Fa-f]{2}', 'g')
    return reg.test(character)
  },
  /**
   * 判断是否为空
   */
  isNull (val) {
    if (val instanceof Array) {
      if (val.length === 0) return true
    } else if (val instanceof Object) {
      const arr = Object.keys(val) // 判断对象是否为空
      if (arr.length <= 0) return true
    } else {
      const str = '' + val
      if (str === '[]' || str === '{}') {
        return true
      } else if (val === 'null' || val == null || val === 'undefined' || val === undefined || val === '') return true
      return false
    }
    return false
  },
  // 递归遍历，判断某个字符是否经过多次编码，直到恢复非编码状态，最多30次递归，避免进入死循坏
  recursionDecode (str, count = 30) {
    if (!str) return str
    const val = this.decodeContent(str)
    const bool = this.isURLEncoded(val)
    // console.log('recursionDecode1-count', count, bool, str)
    if (bool && count > 0) {
      return this.recursionDecode(val, --count)
    }
    return val
  },
  // 解码 对任何非标准字符进行解码
  decodeContent (value, type = 0) {
    let str = ''
    // debugger
    if (type === 1) {
      str = decodeURI(value)
    } else {
      str = decodeURIComponent(value)
    }
    return str
  },

  /**
   * 设置 临时 缓存
   * @param key
   * @param value
   */
  setSession (key, value) {
    // debugger
    return new Promise((resolve, reject) => {
      try {
        window.sessionStorage.setItem(key, JSON.stringify(value))
        resolve()
      } catch (e) {
        console.error('setSession 错误')
        reject('setSession 错误')
      }
    })
  },
  /**
   * 获取 临时 缓存
   * @param key
   */
  getSession (key) {
    // debugger
    const item = window.sessionStorage.getItem(key)
    if (this.isNull(item)) {
      return ''
    }
    return JSON.parse(window.sessionStorage.getItem(key))
  },
  removeSession (key) {
    window.sessionStorage.removeItem(key)
  },
  /**
   * 设置 永久 缓存
   * @param key
   * @param value
   */
  setLocalStorage (key, value) {
    // debugger
    return new Promise((resolve, reject) => {
      try {
        window.localStorage.setItem(key, JSON.stringify(value))
        resolve()
      } catch (e) {
        console.error('setSession 错误')
        reject('setSession 错误')
      }
    })
  },
  /**
   * 获取 永久 缓存
   * @param key
   */
  getLocalStorage (key) {
    const item = window.localStorage.getItem(key)
    if (this.isNull(item)) {
      return ''
    }
    return JSON.parse(window.localStorage.getItem(key))
  },
  /**
   * 获取 cookie
   * @param key
   */
  getCookie (key, config) {
    config = config || {}
    let value = Cookies.get(key)
    if (config.isCompile) { // 是否要解密
      value = this.unCompileStr(value)
    }
    return value
  },
  /**
   * 设置 cookie
   * @param key
   * @param val
   * @param expiresTime 秒
   */
  setCookie (key, val, expiresTime, config) {
    config = config || {}
    let value = val
    if (!this.isNull(expiresTime)) { // 设置了时限
      const seconds = expiresTime
      const expires = new Date(new Date() * 1 + seconds * 1000)
      if (config.isCompile) { // 是否加密
        value = this.compileStr(val)
      }
      return Cookies.set(key, value, { expires: expires })
    } else {
      if (config.isCompile) { // 是否加密
        value = this.compileStr(val)
      }
      return Cookies.set(key, value)
    }
  }
}
